package pakete2;

import java.sql.*;
import java.util.Vector;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Date;

public class DB_Kudeatzailea {

	static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";

	static final String DATABASE_URL = "jdbc:mysql://localhost/eraikikon";

	static final String USERNAME = "ikasle01";

	static final String PASSWORD = "ikasle01";

	private Connection connection;

	private Statement statement;

	private ResultSet resultSet;

	private ResultSetMetaData metaData;

	private int numberOfRows;

	private boolean connectedToDatabase = false;

	
	/**
	 *DB_kudeatzailearen eraikitzailea
	 *
	 */
	public DB_Kudeatzailea() {
	}

	/**
	 * Konexio sortu eta datu basera konexioa egiten du
	 * 
	 * @throws SQLException
	 * @throws ClassNotFoundException
	 */
	public void getKonexioa() throws SQLException, ClassNotFoundException {

		// load database driver class
		Class.forName(JDBC_DRIVER);

		// connect to database
		connection = DriverManager.getConnection(DATABASE_URL, USERNAME,
				PASSWORD);
		// create Statement to query database
		statement = connection.createStatement();
		connectedToDatabase = true;
		

	}

	/**
	 * parametro bidez pasatako galdera exekutatzen du datu basean eta emaitza itzultzen du
	 * @param exekutatu nahi den galdera 
	 * @return Resulset 
	 * @throws SQLException
	 * @throws IllegalStateException
	 */
	public ResultSet exekutatuGaldera(String galdera) throws SQLException,
			IllegalStateException {
		// ziurtatu datu basera konektatuta gaudela
		if (!connectedToDatabase)
			throw new IllegalStateException("Datu basera konektatu gabe!!");
		// galdera zeaztu eta exekutatu
		return statement.executeQuery(galdera);

	}

	/**
	 * datu basean parametro bidez pasatako eguneraketak egiten ditu
	 * @param datu basean egin nahi den eguneraketaren sql sententzia
	 * @return -1 txartela ez badago edo lehendik desgaituta bazegoen 
	 * @throws SQLException
	 * @throws IllegalStateException
	 */
	public int eguneratu(String eguneraketa) throws SQLException,
			IllegalStateException {
		// ziurtatu datu basera konektatuta gaudela
		if (!connectedToDatabase)
			throw new IllegalStateException("Datu basera konektatu gabe!!");
		// exekutatu eguneraketa
		int x=statement.executeUpdate(eguneraketa);
		return x;
	}

	/**
	 * Profil mota bat emanda mota horretako erabiltzaile guztien id-ak itzultzen ditu bektore batean
	 * @param profil mota
	 * @return erabiltzaile id-z osatutako bektorea
	 * @throws IllegalStateException
	 * @throws SQLException
	 * @throws ClassNotFoundException
	 */
	public Vector<Integer> getErabiltzaileak(String mota)
			throws IllegalStateException, SQLException, ClassNotFoundException {

		Vector<Integer> emaitza = new Vector<Integer>();
		String galdera;
		// SQL galdera prestatu parametroen arabera DB_Kudeatzaileak exekutatu
		// dezan
		galdera = " select e.izena, e.id, txartelaid "
				+ " from erabiltzailea as e inner join profila as p on e.profilaid = p.id "
				+ " where mota='" + mota + "'";
		// SQL galdera egikaritu
		resultSet = this.exekutatuGaldera(galdera);
		// SQL emaitza bektore batean sartu
		// resultSet=statement.executeQuery(galdera);
		while (resultSet.next()) {
			emaitza.addElement(new Integer(resultSet.getInt("txartelaid")));
		}

		return emaitza;
	}

	/**
	 * parametro bidez pasatako erabiltzailearen txartelak 2 urte baina gehiago baditu txartelaren identifikadorea itzuliko du, bestela null
	 * @param erabiltzailearen identifikadorea
	 * @return erabiltzailearen txartelaren id-a edo null
	 * @throws IllegalStateException
	 * @throws SQLException
	 * @throws ClassNotFoundException
	 */
	public Integer getTxartela2Urte(int erab_id) throws IllegalStateException,
			SQLException, ClassNotFoundException {
		String galdera1;
		// SQL galdera prestatu parametroen arabera DB_Kudeatzaileak exekutatu
		// dezan
		galdera1 = " select txartelaid"
				+ " from txartela as t  inner join erabiltzailea as e on t.id = e.txartelaid"
				+ " where t.gaitudata<'2005/03/24'and e.id="
				+ Integer.toString(erab_id);
		// SQL galdera egikaritu
		resultSet = this.exekutatuGaldera(galdera1);
		// SQL emaitza bektore batean sartu
		if (resultSet.next())
			return (new Integer(resultSet.getInt(1)));
		else
			return null;
	}

	/**
	 * txartel baten id-a eta hilabete kopuru bat emanda, azken hilabete horietan izan dituen sarbide eskaera ukatuen id-ez osatutako bektore bat itzultzen du
	 * @param txartel baten identifikadorea
	 * @param hilabete kopuru bat
	 * @return sarbide eskaera id-ez osatutako bektorea
	 * @throws IllegalStateException
	 * @throws SQLException
	 */
	public Vector<Integer> getSarbideEskaeraUkatuak(int txartel_id,
			int hilabeteKop) throws IllegalStateException, SQLException {
		Vector<Integer> emaitza = new Vector<Integer>();
		String galdera;
		int hilabetea;
		int urtea;
		int eguna;
		Calendar unekoData;
		unekoData = new GregorianCalendar();
		unekoData.setTime(new Date());
		// uneko hilabetea lortu
		unekoData.add(Calendar.MONTH, -hilabeteKop);
		hilabetea = unekoData.get(2) + 1;
		urtea = unekoData.get(1);
		eguna = unekoData.get(5);
		// SQL galdera prestatu parametroen arabera DB_Kudeatzaileak exekutatu
		// dezan
		galdera = " select se.id"
				+ " from txartela as t inner join sarbideeskaera as se on se.txartelaid=t.id "
				+ " where se.baimendua=false and t.id="
				+ Integer.toString(txartel_id) + " and se.ordua >'"
				+ Integer.toString(urtea) + "/" + Integer.toString(hilabetea)
				+ "/" + Integer.toString(eguna) + "'";
		// SQL galdera egikaritu
		resultSet = this.exekutatuGaldera(galdera);
		// SQL emaitza bektore batean sartu
		while (resultSet.next()) {
			emaitza.addElement(new Integer(resultSet.getInt(1)));
		}
		return emaitza;

	}

	
	/**
	 * erabiltzaile baten identifikadorea emanda bere izena lortzen du
	 * @param erabiltzaile baten identifikadorea
	 * @return erabiltzaileren izena
	 * @throws IllegalStateException
	 * @throws SQLException
	 */
	public String getErabiltzailea(int erabId) throws IllegalStateException,
			SQLException {
		String galdera;
		// SQL galdera prestatu parametroen arabera DB_Kudeatzaileak exekutatu
		// dezan
		galdera = "select e.izena " +
				" from (erabiltzailea as e inner join txartela as t on e.txartelaid = t.id)"
				+ " where e.id="
				+ Integer.toString(erabId);
		resultSet = this.exekutatuGaldera(galdera);
		if (resultSet.next())
			return resultSet.getString("izena");
		return null;
	}

	/**
	 * Erabiltzaile baten identifikadorea emanda bere txartelaren identifikadorea itzultzen du
	 * @param erabiltzaile baten identifikadorea
	 * @return txartelaren identifikadorea
	 * @throws IllegalStateException
	 * @throws SQLException
	 */
	public int getTxartela(int erab_id) throws IllegalStateException,
			SQLException {
		String galdera;
		// SQL galdera prestatu parametroen arabera DB_Kudeatzaileak exekutatu
		// dezan
		galdera = "select txartelaid from erabiltzailea where id="
				+ Integer.toString(erab_id);
		resultSet = this.exekutatuGaldera(galdera);
		if (resultSet.next())
			return resultSet.getInt("txartelaid");
		return -1;
	}

	/**
	 * erabiltzailea baten izena bere txartelaren identifikadorea eta deskribapen bat emanda intzidentzia bat sortzen du eta datu basea eguneratzen du
	 * @param erabiltzaile izena
	 * @param txartelaren identifikadorea
	 * @param deskribapena
	 * @throws IllegalStateException
	 * @throws SQLException
	 */
	public void sortuIntzidentzia(String izena, int txartelKod,
			String deskribapena) throws IllegalStateException, SQLException {
		String galdera;
		// SQL galdera prestatu parametroen arabera DB_Kudeatzaileak exekutatu
		// dezan
		int hilabetea;
		int urtea;
		int eguna;
		Calendar unekoData;
		unekoData = new GregorianCalendar();
		unekoData.setTime(new Date());
		hilabetea = unekoData.get(2) + 1;
		urtea = unekoData.get(1);
		eguna = unekoData.get(5);
		;
		galdera = "insert into gertakaria (ordua,mota,deskribapena,larritasuna,idtxartela) values ("
				+ "'"
				+ Integer.toString(urtea)
				+ "/"
				+ Integer.toString(hilabetea)
				+ "/"
				+ Integer.toString(eguna)
				+ "'"
				+ ",'IG','irakasle gatazkatsuena','altua',"
				+ Integer.toString(txartelKod) + ");";
		this.eguneratu(galdera);

	}

	/**
	 * numberOfRows aldagaiaren balioa itzultzen du
	 * @return numberOfRows
	 */
	public int getNumberOfRows() {
		if (!connectedToDatabase)
			throw new IllegalStateException("Not Connected to Database");
		return numberOfRows;
	}

	/**
	 * zutabe baten posizioa emanda zutabe horren mota itzultzen du
	 * @param zutabearen posizioa
	 * @return zutabearen mota
	 * @throws SQLException
	 * @throws ClassNotFoundException
	 */
	public Class getColumnClass(int zutabe) throws SQLException,
			ClassNotFoundException {
		if (!connectedToDatabase)
			throw new IllegalStateException("Not Connected do Database");
		String className = metaData.getColumnClassName(zutabe);
		return Class.forName(className);
	}

	/**
	 * Zutabe kopurua itzultzen du
	 * @return zutabe kopurua
	 * @throws SQLException
	 */
	public int getColumnCount() throws SQLException {
		if (!connectedToDatabase)
			throw new IllegalStateException("Not Connected to Database");
		return metaData.getColumnCount();
	}

	/**
	 * Parametro bidez pasatako lerrora mugitzen du kurtsorea
	 * @param lerro kopurua adierazten duen int-a
	 * @throws SQLException
	 */
	public void absolute (int i) throws SQLException {
		if (!connectedToDatabase)
			throw new IllegalStateException("Not Connected to Database");
		resultSet.absolute(i);

	}

	/**
	 * Uneko lerroan eta parametro bezala jasotako zutabean dagoen objetua itzultzen du
	 * @param zutabea adierazten duen int-a
	 * @return Object bat, uneko lerroan eta parametro bidez pasatako zutabean dagoena
	 * @throws SQLException
	 */
	public String getObject(int i) throws SQLException {
		if (!connectedToDatabase)
			throw new IllegalStateException("Not Connected to Database");
		return resultSet.getString(i);
	}

	/**
	 * zutabearen posizioa emanda bere izena itzultzen du
	 * @param zutabearen posizioa
	 * @return zutabearen izena
	 * @throws SQLException
	 */
	public String getColumnName(int i) throws SQLException {
		if (!connectedToDatabase)
			throw new IllegalStateException("Not Connected to Database");
		return metaData.getColumnName(i);

	}

	/**
	 * parametro bidez pasatako galdera exekutatzen du datu basean eta numberOfRows aldagaian uzten du emaitzaren lerro kopurua 
	 * @param query
	 * @throws SQLException
	 */
	public void setQuery(String query) throws SQLException  {
		if (!connectedToDatabase)
			throw new IllegalStateException("Not Connected to Database");

		resultSet = statement.executeQuery(query);

		// obtain meta data for ResultSet
		metaData = resultSet.getMetaData();

		// determine number of rows in ResultSet
		resultSet.last(); // move to last row
		numberOfRows = resultSet.getRow(); // get row number
		
	}

	/**
	 * sarbide eskaera baten identifikadorea emanda, sarbide eskaera egin duen erabiltzailearen identifikadorea itzultzen du 
	 * @param sarbide eskaera identifikadorea
	 * @return erabiltzailearen identifikadorea
	 * @throws IllegalStateException
	 * @throws SQLException
	 */
	public int getErabiltzaileId(int i) throws IllegalStateException, SQLException {
		String galdera;
		// SQL galdera prestatu parametroen arabera DB_Kudeatzaileak exekutatu
		// dezan
		galdera = "select e.id " +
				"from (sarbideeskaera se inner join txartela t on se.txartelaid=t.id) inner join erabiltzailea e on t.id=e.txartelaid " +
				"where se.id ="+ Integer.toString(i);
		resultSet = this.exekutatuGaldera(galdera);
		if (resultSet.next())
			return resultSet.getInt("id");
		return -1;
	}

	public int getIrakasleId(int i) throws IllegalStateException, SQLException {
		String galdera;
		// SQL galdera prestatu parametroen arabera DB_Kudeatzaileak exekutatu
		// dezan
		galdera = "select e.id " +
				"from (sarbideeskaera se inner join txartela t on se.txartelaid=t.id) inner join erabiltzailea e on t.id=e.txartelaid " +
				"where se.id ="+ Integer.toString(i);
		resultSet = this.exekutatuGaldera(galdera);
		if (resultSet.next())
			return resultSet.getInt("id");
		return -1;
	}

	public void mugitu(int i) throws SQLException {
		if (!connectedToDatabase)
			throw new IllegalStateException("Not Connected to Database");
		resultSet.absolute(i);
	}
	
	public Vector<String> getTxartelak() throws IllegalStateException, SQLException {
		Vector<String> txartelak = new Vector<String>();
		// SQL galdera egikaritu
		resultSet = this.exekutatuGaldera("select id from txartela");
		// SQL emaitza bektore batean sartu
		// resultSet=statement.executeQuery(galdera);
		while (resultSet.next()) {
			txartelak.addElement(resultSet.getString("id"));
		}
		return txartelak;
	}

	public String erabiltzaileDatuakLortu(String txartelkod) {
		String datuak = null;
		try {
			resultSet = this.exekutatuGaldera("SELECT id, izena, txartelaId, profilaId FROM erabiltzailea where txartelaID='"+txartelkod+"'");
		} catch (IllegalStateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			//while (resultSet.next()){
				datuak = resultSet.getString("id")+"\t"+resultSet.getString("izena")+"\t"+resultSet.getString("txartelaId")+"\t"+resultSet.getString("profilaId");
//				erabDatuak.add(resultSet.getString("id"));
//				erabDatuak.add(resultSet.getString("izena"));
//				erabDatuak.add(resultSet.getString("txartelaId"));
//				erabDatuak.add(resultSet.getString("profilaId"));
//			}
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return datuak;
		
	}
	

	public Vector<String> erabiltzaileakLortu() {
			String galdera;
			Vector<String> emaitza = new Vector<String>();
			galdera = " SELECT * FROM eraikikon.erabiltzailea e inner join txartela t where e.txartelaid=t.id ";
		// SQL galdera egikaritu
		try {
			resultSet = this.exekutatuGaldera(galdera);
			while (resultSet.next()) {
				emaitza.addElement(new String(resultSet.getString(1))+"\t"+new String(resultSet.getString(2))+"\t"+new String(resultSet.getString(4))+"\t"+new String(resultSet.getString(5)));
//				emaitza.addElement(new String(resultSet.getString(2)));
//				emaitza.addElement(new String(resultSet.getString(4)));
//				emaitza.addElement(new String(resultSet.getString(5)));
//				emaitza.addElement(new String(resultSet.getString(7)));
//				emaitza.addElement(new String(resultSet.getString(8)));
			}
		} catch (IllegalStateException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		// SQL emaitza bektore batean sartu
		
		return emaitza;
		
//		return null;
		}

	public int GaituTxartela(String txartelkod) {
		int x=0;
		int y=0;
		
//		String eguneraketa1 =("update txartela set gaituData=current_date where id="+txartelkod+ " and (desgaituData is not null or gaituData is null");
//		String eguneraketa2=("update txartela set desgaituData=null where id="+txartelkod+ " and (desgaituData is not null or gaituData is null");
		String eguneraketa1 = "update txartela set gaituData=current_date where id="+txartelkod;
		try {
			x=eguneratu(eguneraketa1);
//			y=eguneratu(eguneraketa2);
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return x;
	}

	public int desgaituTxartela(String txartelkod) {
		Integer hilabetea, urtea, eguna;
		Calendar unekoData;
		unekoData = new GregorianCalendar();
		unekoData.setTime(new Date());
		hilabetea = unekoData.get(2) + 1;
		urtea = unekoData.get(1);
		eguna = unekoData.get(5);
		int x=0;
		
		String eguneraketa = "UPDATE txartela set desgaituData ='" +
			Integer.toString(urtea)+ "-"+ Integer.toString(hilabetea)+"-"+ Integer.toString(eguna) +
			"' WHERE id="+txartelkod+ " and desgaituData is null";
		try {
			x=eguneratu(eguneraketa);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	
		return x;
	}
	public int exekutatuAgindua(String agindua) throws SQLException,
	IllegalStateException {
// ziurtatu datu basera konektatuta gaudela
if (!connectedToDatabase)
	throw new IllegalStateException("Datu basera konektatu gabe!!");
// galdera zeaztu eta exekutatu
return statement.executeUpdate(agindua);
}

public int sartuErabiltzailea(String izen, String pasahitz) {
//int i = -1;
PreparedStatement s = null;
PreparedStatement st = null;
try {
	s = connection.prepareStatement("INSERT INTO erabiltzailea "
			+ "(izena, pasahitza) values (?,?)");
	s.setString(1, izen);
	s.setString(2, pasahitz);
	s.executeUpdate();
	st = connection
			.prepareStatement("Select id from erabiltzailea where izena = ? and pasahitza = ?");
	st.setString(1, izen);
	st.setString(2, pasahitz);
	resultSet = st.executeQuery();
	if (resultSet.next())
		return resultSet.getInt("id");
	else
		return (-2);
} catch (SQLException e1) {
	e1.printStackTrace();
	return (-1);
}
}

public void setProfila(int i, int j) {
// j id zenbakia duen erabiltzaileari i profil id-a esleitzen dio
PreparedStatement stat = null;

try {
	stat = connection
			.prepareStatement("update erabiltzailea set profilaId = ? where id = ?");
	stat.setInt(1, i);
	stat.setInt(2, j);
	stat.executeUpdate();
} catch (IllegalStateException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
} catch (SQLException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
}
}

public int createTxartela() {
//Gaurko data lortu:
//Calendar orain;
//orain = new GregorianCalendar();
//orain.setTime(new Date());
//PreparedStatement agindua = null;
//PreparedStatement ps2 = null;
//ResultSet erantzuna;
int id = 0;
String agindu1,agindu2,agindu3;
ResultSet erantzuna;
try {
	//Sortu Txartel berri bat gaituData bihar eta desgaituData null dutelarik
	agindu1 = "INSERT INTO txartela (gaituData, desgaituData) values (current_date+1,NULL)";
	int z1 = this.exekutatuAgindua(agindu1);
	//Lortu sortu berri den txartelaren Id-a
	agindu2 = "SELECT id FROM txartela WHERE gaituData=current_date+1";
	erantzuna = this.exekutatuGaldera(agindu2);
	if (erantzuna.next())
		id = (erantzuna.getInt("id"));
	else
		return (-2);
	//Utzi sortu berri dugun txartelean, gaituData Null bezala
	agindu3 = "UPDATE txartela SET gaitudata = null WHERE gaituData = CURRENT_DATE+1";
	int z2 = this.exekutatuAgindua(agindu3);
} catch (SQLException e) {
	e.printStackTrace();
}
catch (IllegalStateException e) {
	e.printStackTrace();
}
return id;
}
public void esleituTxartela(int txartela,int ida) throws IllegalStateException, SQLException{
String agindua;
int emaitza;
agindua = "UPDATE erabiltzailea SET txartelaID= "+txartela +" WHERE id= "+ida;
emaitza = this.exekutatuAgindua(agindua);
}


}
